/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 * <p>
 * https://www.renren.io
 * <p>
 * 版权所有，侵权必究！
 */

package io.renren.modules.sys.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.renren.common.utils.Constant;
import io.renren.common.utils.MapUtils;
import io.renren.modules.sys.dao.SysMenuDao;
import io.renren.modules.sys.entity.SysMenuEntity;
import io.renren.modules.sys.service.SysMenuService;
import io.renren.modules.sys.service.SysRoleMenuService;
import io.renren.modules.sys.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;


@Service("sysMenuService")
public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenuEntity> implements SysMenuService {
  @Autowired
  private SysUserService sysUserService;
  @Autowired
  private SysRoleMenuService sysRoleMenuService;

  @Override
  public List<SysMenuEntity> queryListParentId(Long parentId, List<Long> menuIdList) {
    List<SysMenuEntity> menuList = queryListParentId(parentId);
    if (menuIdList == null) {
      return menuList;
    }

    List<SysMenuEntity> userMenuList = new ArrayList<>();
    for (SysMenuEntity menu : menuList) {
      if (menuIdList.contains(menu.getMenuId())) {
        userMenuList.add(menu);
      }
    }
    return userMenuList;
  }

  @Override
  public List<SysMenuEntity> queryListParentId(Long parentId) {
    return baseMapper.queryListParentId(parentId);
  }

  @Override
  public List<SysMenuEntity> queryNotButtonList() {
    return baseMapper.queryNotButtonList();
  }

  @Override
  public List<SysMenuEntity> getUserMenuList(Long userId) {
    //系统管理员，拥有最高权限
    if (userId == Constant.SUPER_ADMIN) {
      return getMenuList(null);
    }

    //用户菜单列表
    List<Long> menuIdList = sysUserService.queryAllMenuId(userId);
    return getMenuList(menuIdList);
  }

  /**
   * 获取拥有的菜单列表
   * @param menuIdList
   * @return
   */
  private List<SysMenuEntity> getMenuList(List<Long> menuIdList) {
    // 查询拥有的所有菜单
    List<SysMenuEntity> menus = this.baseMapper.selectList(new QueryWrapper<SysMenuEntity>()
      .in(Objects.nonNull(menuIdList), "menu_id", menuIdList).in("type", 0, 1));
    //查询完成 对此list直接排序
    Collections.sort(menus);

    // 将id和菜单绑定
    HashMap<Long, SysMenuEntity> menuMap = new HashMap<>(12);
    for (SysMenuEntity s : menus) {
      menuMap.put(s.getMenuId(), s);
    }
    // 使用迭代器,组装菜单的层级关系
    Iterator<SysMenuEntity> iterator = menus.iterator();
    while (iterator.hasNext()) {
      SysMenuEntity menu = iterator.next();
      SysMenuEntity parent = menuMap.get(menu.getParentId());
      if (Objects.nonNull(parent)) {
        parent.getList().add(menu);
        // 将这个菜单从当前节点移除
        iterator.remove();
      }
    }

    return menus;
  }

  @Override
  public void delete(Long menuId) {
    //删除菜单
    this.removeById(menuId);
    //删除菜单与角色关联
    sysRoleMenuService.removeByMap(new MapUtils().put("menu_id", menuId));
  }

  /**
   * 获取所有菜单列表
   */
  private List<SysMenuEntity> getAllMenuList(List<Long> menuIdList) {
    //查询根菜单列表
    List<SysMenuEntity> menuList = queryListParentId(0L, menuIdList);
    //递归获取子菜单
    getMenuTreeList(menuList, menuIdList);

    return menuList;
  }

  /**
   * 递归
   */
  private List<SysMenuEntity> getMenuTreeList(List<SysMenuEntity> menuList, List<Long> menuIdList) {
    List<SysMenuEntity> subMenuList = new ArrayList<SysMenuEntity>();

    for (SysMenuEntity entity : menuList) {
      //目录
      if (entity.getType() == Constant.MenuType.CATALOG.getValue()) {
        entity.setList(getMenuTreeList(queryListParentId(entity.getMenuId(), menuIdList), menuIdList));
      }
      subMenuList.add(entity);
    }

    return subMenuList;
  }
}
